package com.emmmya.ocs.modules.system.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.emmmya.ocs.common.utils.ResultUtil;
import com.emmmya.ocs.common.vo.Result;
import com.emmmya.ocs.modules.system.entity.TimedTask;
import com.emmmya.ocs.modules.system.manager.QuartzManager;
import com.emmmya.ocs.modules.system.service.TimedTaskService;
import com.emmmya.ocs.modules.system.vo.TimedTaskVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

/**
 * 定时任务前端控制器
 *
 * @author xm
 * @date    2019-12-2 14:59:29
 */
@RestController
@RequestMapping("task")
public class TaskController {

    //定时任务实现业务
    @Autowired
    private TimedTaskService timedTaskService;

    @Autowired
    private QuartzManager quartzManager;

    @RequestMapping("getManagerTask")
    public Result<Object> getManagerTask(@RequestParam(value="status",required = false)String status){
        try {
            List<TimedTask> allJob = null;
            if("1".equals(status)){
                allJob = quartzManager.getRunningJob();
            }else {
                allJob = quartzManager.getAllJob();
            }
            return ResultUtil.data(allJob);
        } catch (Exception e) {
            e.printStackTrace();
            return ResultUtil.data("获取管理器数据出错了，请联系管理员");
        }
    }

    /**
     * 查询任务列表,可以根据整备场,机务段,类名,任务ID查询
     * @param
     * @return
     */
    @GetMapping("list")
    public Result<Object> list(TimedTask task) {
        List<TimedTask> timedTaskList = timedTaskService.getTimedTask(task);
        return ResultUtil.data(timedTaskList);
    }

    @GetMapping("getTaskList")
    public Result<Object> getTaskList(TimedTaskVo vo) {
        try {
            // List<TimedTask> runningJob = quartzManager.getRunningJob();
            IPage<TimedTask> page = vo.createPage();
            timedTaskService.getListByPage(page,vo.createWrapper());
            return ResultUtil.data(page);
        } catch (Exception e) {
            e.printStackTrace();
            return ResultUtil.data("出错了，错误信息:"+e.getMessage());
        }
    }

    /**
     * 查询所有运行中任务列表
     * @return
     */
    @GetMapping("getRunningJob")
    public ResponseEntity getRunningJob() {
        //List<Dingshi> dingshiList = dingshiService.getRunningJob();
        //return new ResponseEntity(dingshiList,HttpStatus.OK);
        return null;
    }

    /**
     * 新增任务 (特别注意类名称是类的包路径+类名)
     * @param
     * @return
     */
    @PostMapping("addJob")
    public Result<Object> addJob(@RequestBody TimedTask task) {
        try {
            if (StringUtils.isEmpty(task)) {
                return ResultUtil.error("参数传输有误");
            }
            //task.setCreateTime(new Date());
            //数据库保存定时任务
            String s = timedTaskService.addTimedTask(task);
            //若保存的任务是开启状态
            if ("1".equals(task.getStatus())) {
                timedTaskService.addJob(task.getJobId());
            }

            return ResultUtil.success("保存成功！");
        } catch (Exception e) {
            e.printStackTrace();
            return ResultUtil.error("保存出错，请重试，如多次提示此错误，请联系管理员。");
        }
    }
    /**
     * 修改任务状态
     */
    @GetMapping("updateJobStatus")
    @ResponseBody
    public Result<Object> updateJobStatus(@RequestParam("jobId") String id,@RequestParam("status") String status){
        if("0".equals(status)){
            return pauseJob(id);
        }else if("1".equals(status)){
            return resumeJob(id);
        }
        return ResultUtil.error("修改错误，请重试！");
    }


    /**
     * 暂停服务
     * @param id
     * @return
     */
    @GetMapping("pauseJob")
    @ResponseBody
    public Result<Object> pauseJob(@RequestParam("jobId") String id) {
        timedTaskService.pauseJob(id);
        return ResultUtil.success("暂停服务成功！");
    }

    /**
     * 恢复服务 如果管理器没有加入过该任务，则新加如并开启。如果加入过，则恢复任务
     * @param id
     * @return
     */
    @GetMapping("resumeJob")
    @ResponseBody
    public Result<Object> resumeJob(@RequestParam("jobId")String id) {
        timedTaskService.resumeJob(id);
        return ResultUtil.success("恢复服务成功！");
    }


    /**
     * 更新定时任务信息 不做启动任务
     * @param task
     * @return
     */
    @PostMapping("update")
    public Result<Object> update(@RequestBody TimedTask task){
        //SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //task.setUpdateTime(new Date());
        //更新数据库信息
        //timedTaskService.updateTimedTask(task);
        //TimedTask byKey = timedTaskService.getByKey(task.getJobId());
        //若开启任务
//        if ("1".equals(byKey.getStatus())) {
//            timedTaskService.update(byKey);
//        }
        try {
            if(!StringUtils.isEmpty(task.getJobId())){
                timedTaskService.update(task);
                timedTaskService.resumeJob(task.getJobId());
                return ResultUtil.success("更新成功！");
            }else{
                return ResultUtil.error("更新失败！传入参数有误，请刷新页面重试。");
            }
        } catch (Exception e) {
//            e.printStackTrace();
            return ResultUtil.error("系统错误，请联系系统管理员处理，错误信息:"+e.getMessage());
        }
    }

    /**
     * 删除定时任务
     * @param id
     * @return
     */
    @DeleteMapping("deleteTaskById")
    public Result<Object> del(@RequestParam(value="jobId") String id){
        //删除任务
        timedTaskService.deleteJob(id);
        //删除数据库
        timedTaskService.delTimedTask(id);
        return ResultUtil.success("更新成功！");
    }

    /**
     * 修改任务状态0关闭,1启用
     * @param task
     * @return
     */
    @PutMapping("updateState")
    public Result<Object> updateState(TimedTask task){

        if (StringUtils.isEmpty(task)) {
            return ResultUtil.error("参数传输有误");
        }
        //SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        task.setUpdateTime(new Date());
        timedTaskService.updateTimedTask(task);
        //改为启用
        if ("1".equals(task.getStatus())) {
            timedTaskService.addJob(task.getJobId());
            //改为关闭
        }else if("0".equals(task.getStatus())){
            //删除任务
            timedTaskService.deleteJob(task.getJobId());
        }
        return ResultUtil.success("更新任务状态成功！");
    }

}